package modes

import (
	"errors"
	"fmt"
	"strconv"
	"time"
)

/*
 * 描述：订单管理
 *
 *	单号： 功能字符G + 20191220 + 今日支付编号0001 + 子单号00
 *
 *
 ********************************************************************************************/
type UserOrder struct {
	Id        int64  `json:"ord_id" xorm:"id"`                 // 订单ID
	UId       int64  `json:"ord_uid" xorm:"uid"`               // 下单工号
	CId       int64  `json:"ord_cid" xorm:"cid"`               // 班型ID
	BillNo    string `json:"ord_bill_no" xorm:"bill_no"`       // 单号
	RealPrice int    `json:"ord_real_price" xorm:"real_price"` // 实付价格
	ShowPrice int64  `json:"ord_show_price" xorm:"show_price"` // 班型价格
	RealBill  string `json:"ord_real_bill" xorm:"real_bill"`   // 支付单号
	PayType   int    `json:"ord_pay_type" xorm:"pay_type"`     // 支付方式 0 未知 1 微信 2 支付宝
	At        int64  `json:"ord_at" xorm:"at"`                 // 下单时间
	PayAt     int64  `json:"ord_pay_at" xorm:"pay_at"`         // 支付时间
	State     int    `json:"ord_state" xorm:"state"`           // 状态： 0 未支付 1 已支付 2 已退款
}

func (this *UserOrder) TableName() string {
	return "user_order"
}

func (this *UserOrder) Save() (int64, error) {
	this.At = time.Now().Unix()
	return Db(0).Insert(this)
}

func (this *UserOrder) Get() (bool, error) {
	return Db(0).Get(this)
}
func (this *UserOrder) GetSubBillNo() (string, error) {
	var val UserOrder
	where := fmt.Sprintf("bill_no like '%s%%'", string([]byte(this.BillNo)[:13]))
	fage, err := Db(0).Where(where).Desc("at").Get(&val)
	if err == nil {
		if !fage {
			return "", errors.New("不存在此账单")
		}
		sbu, _ := strconv.Atoi(string([]byte(val.BillNo)[13:]))
		return fmt.Sprintf("%s%.2d", string([]byte(val.BillNo)[:13]), sbu+1), nil
	}
	return "", err
}

func (this *UserOrder) update(where string, field string) (int64, error) {
	return Db(0).Where(where).Cols(field).Update(this)
}

func (this *UserOrder) IdSet(field string) (int64, error) {
	where := fmt.Sprintf("id = %d", this.Id)
	return this.update(where, field)
}

func (this *UserOrder) count(where string) (int64, error) {
	return Db(0).Where(where).Count(this)
}

func (this *UserOrder) Where(fage, count, page int, where, field string) ([]UserOrder, error) {
	list := make([]UserOrder, 0)
	var err error
	if field == "" {
		field = "id"
	}
	page--
	if 0 == fage { // 从小到大排序
		err = Db(0).Table(this.TableName()).Where(where).
			Asc(field).
			Limit(count, page*count).
			Find(&list)
	} else { // 从大到小排序
		err = Db(0).Table(this.TableName()).Where(where).
			Desc(field).
			Limit(count, page*count).
			Find(&list)
	}
	return list, err
}

func (this *UserOrder) GetOrder() (bool, error) {
	where := fmt.Sprintf("id = %d and state = 0", this.Id)
	return Db(0).Where(where).Get(this)
}

func (this *UserOrder) GetOrderInfo() (bool, error) {
	where := fmt.Sprintf("bill_no = '%s' ", this.BillNo)
	return Db(0).Where(where).Get(this)
}

func (this *UserOrder) PList(val *Pager) error {
	var field string
	list := make([]UserOrder, 0)
	var err error
	val.TName = "crm_order"
	switch val.Coll {
	case 0:
		field = "crm_order.at" // 下单时间
	case 1:
		field = "crm_order.pay_at" // 支付时间
	case 2:
		field = "crm_order.bill_no" // 单号排序
	case 3:
		field = "crm_order.bill_type" // 支付类型
	case 4:
		field = "crm_order.real_price" // 实付价格
	case 5:
		field = "crm_order.pay_type" // 支付方式
	}
	err = Db(0).Table(val.TName).
		//Join( "INNER", "order_classes", "crm_order.id = order_classes.order_id" ).
		Where(val.ToWhere()).
		Desc(field).
		Limit(val.Count, (val.Page-1)*val.Count).
		Find(&list)
	val.Total, _ = Db(0).Table(val.TName).
		//Join( "INNER", "order_classes", "crm_order.id = order_classes.order_id" ).
		Where(val.ToWhere()).
		Desc(field).
		Count(this)

	if err == nil {
		val.List = list
	}
	return err
}
